﻿using System;
using Acaweb.Data.Contracts;
using Acaweb.Model.Entities;
using Acaweb.Model.Entities.DatosCompuestos;
using Acaweb.Componentes.Contracts;
using System.Collections.Generic;
using System.Linq;


namespace Acaweb.Componentes
{
    public class RepresentantesService : BaseService, IRepresentantesService
    {
        IRepresentantesDao _RepresentantesDao;
        IVotosDao _VotosDao;
        IEstudiantesDao _EstudiantesDao;
        IDocentesDao _DocentesDao;

        public IDocentesDao DocentesDao
        {
            get { return _DocentesDao; }
            set { _DocentesDao = value; }
        }

        public IEstudiantesDao EstudiantesDao
        {
            get { return _EstudiantesDao; }
            set { _EstudiantesDao = value; }
        }

        public IVotosDao VotosDao
        {
            get { return _VotosDao; }
            set { _VotosDao = value; }
        }

        public IRepresentantesDao RepresentantesDao
        {
            get { return _RepresentantesDao; }
            set { _RepresentantesDao = value; }
        }

        public void Create(Representantes Representante)
        {
            RepresentantesDao.Save(Representante);
        }

        public IList<Representantes> GetAll()
        {
            return _GetAll();
        }

        private List<Representantes> _GetAll()
        {
            List<Representantes> Lista = RepresentantesDao.GetAll().ToList();

            Lista.ForEach(t => t.Estudiante = t.IsDocente == 0 ? EstudiantesDao.GetByCodigoEstudiante(int.Parse(t.CodigoRepresentante)) : null);
            Lista.ForEach(t => t.Docente = t.IsDocente == 0 ? DocentesDao.GetById(t.CodigoRepresentante) : null);

            return Lista;
        }

        private List<Representantes> _GetDocentes()
        {
            List<Representantes> Lista = RepresentantesDao.GetRepresentantes(true).ToList();

            Lista.ForEach(t => t.Docente = t.IsDocente == 1 && t.CodigoRepresentante != "Docente" ? DocentesDao.GetById(t.CodigoRepresentante) : null);

            return Lista;
        }

        private List<Representantes> _GetEstudiantes()
        {
            List<Representantes> Lista = RepresentantesDao.GetRepresentantes(false).ToList();

            Lista.ForEach(t => t.Estudiante = t.IsDocente == 0 && t.CodigoRepresentante != "Estudiante" ? EstudiantesDao.GetByCodigoEstudiante(int.Parse(t.CodigoRepresentante)) : null);

            return Lista;
        }

        public Dictionary<Representantes, int> GetResult()
        {
            Dictionary<Representantes, int> Result = new Dictionary<Representantes, int>();
            List<Representantes> Representantes = _RepresentantesDao.GetAll().ToList();

            Representantes.ForEach(t => Result.Add(t, _VotosDao.GetByAspirantes(t.CodigoRepresentante).Count));

            return Result;
        }

        //private List<Representantes> DeepLoad(List<Representantes> Representantes)
        //{
        //    List<Representantes> RepresentantesCopy = new List<Representantes>();

        //    Representantes.ForEach(t => RepresentantesCopy.Add(new Representantes
        //    {
        //        CodigoRepresentante = t.CodigoRepresentante,
        //        Estudiante = _EstudiantesDao.GetByCodigoEstudiante(t.CodigoRepresentante)
        //    }));

        //    return RepresentantesCopy;
        //}

        public IList<Representantes> GetByFacultad(int Facultad)
        {
            IList<Representantes> AllList = _GetEstudiantes();
            List<Representantes> List = AllList.Where(t => t.Estudiante != null).Where(t => t.Estudiante.PlanEstudio.CodigoFacultad == Facultad).ToList();
            List.Add(AllList.Where(t => t.Estudiante == null).First());

            return List;
        }

        public IList<Representantes> GetDocentes()
        {
            return _GetDocentes();
        }

        public Representantes GetById(string Id)
        {
            return RepresentantesDao.GetById(Id);
        }
    }
}